package com.atguigu.springcloud.cfgbeans;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RetryRule;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

/**
 * @Auther:
 * @Description:
 * @Date: 2019/11/19 15:42
 */
@Configuration
@Component
public class ConfigBean {

    @Bean("myRestTemplate")
    @LoadBalanced // 开启负载均衡,默认为轮询
    public RestTemplate getRestTemplate(){
        System.out.println("ribbon 负载均衡");
        return new RestTemplate();
    }

    /**
     * 没有这个方法声明负载均衡方式，那么就是用默认的负载均衡算法，轮询负载
     *
     * @return
     */
    //@Bean
    public IRule myIRule() {
//         用指定的负载均衡算发覆盖默认的轮询
//         轮询
//        return new RoundRobinRule();
//         随机
//        return new RandomRule();
//         会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务，还有并发的连接数量超过阈值的服务，然后对生育的服务列表按照轮询策略进行负载均衡
//        return new AvailabilityFilteringRule();
//         根据平均响应时间计算所有服务的权重，响应时间越快服务权重越大被选中的几率越大，刚启动时如果统计信息不足，则使用 RoundRobinRule 策略，登统计信息足够，会切换到 WeightedResponseTimeRule
//        return new WeightedResponseTimeRule();
//         先按照 RoundRobinRule 的策略获取服务，如果获取服务失败则在指定时间内进行重试，获取可用的服务
        return new RetryRule();
//        会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务，然后选择一个并发量最小的服务
//        return new BestAvailableRule();
//         默认规则，复核判断 server 所在区域的性能和 server 的可用性选择服务器
//        return new ZoneAvoidanceRule();
    }

}
